package problem.year2021.february;

/**
 * 今天，书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客（customers[i]）会进入书店，所有这些顾客都会在那一分钟结束后离开。
 * 在某些时候，书店老板会生气。 如果书店老板在第 i 分钟生气，那么 grumpy[i] = 1，否则 grumpy[i] = 0。 当书店老板生气时，那一分钟的顾客就会不满意，不生气则他们是满意的。
 * 书店老板知道一个秘密技巧，能抑制自己的情绪，可以让自己连续 X 分钟不生气，但却只能使用一次。
 * 请你返回这一天营业下来，最多有多少客户能够感到满意的数量。
 * 示例：
 * 输入：customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
 * 输出：16
 * 解释：
 * 书店老板在最后 3 分钟保持冷静。
 * 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
 * 提示：
 * 1 <= X <= customers.length == grumpy.length <= 20000
 * 0 <= customers[i] <= 1000
 * 0 <= grumpy[i] <= 1
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/grumpy-bookstore-owner
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class February23 {
    /**
     * 其实相当于两个对应数组，一个滑动窗口在grumpy上滑动，其长度为x，判断那个滑动窗口的位置时，其customers数量最大
     *
     * @param customers customers[i] 代表第i分钟时客户的数量
     * @param grumpy    grumpy[i] 代表第i分钟时老板是否生气
     * @param X         代表在某段时间，老板持续不生气
     * @return 返回如何控制不生气时间，使整天的顾客满意度最大，并返回满意的顾客数量
     */
    public int maxSatisfied(int[] customers, int[] grumpy, int X) {
        // 1 <= X <= customers.length == grumpy.length <= 20000
        int len = customers.length;
        int sum = 0;
        // 对于上述grumpy来说，生气是1，不生气是0，那么只需要计算在滑动窗口X中生气的最大值，就可以求出最后的结果
        for (int i = 0; i < X; ++i) {
            sum += grumpy[i] * customers[i];
        }
        int temp = sum;
        for (int i = X; i < len; ++i) {
            temp = temp - grumpy[i - X] * customers[i - X] + grumpy[i] * customers[i];
            sum = Math.max(temp, sum);
        }
        // 计算customer原本的顾客和（未生气时间）
        for (int i = 0; i < len; ++i) {
            if (grumpy[i] == 0){
                sum += customers[i];
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        // customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3, answer = 16
        int[] customers = new int[]{1, 0, 1, 2, 1, 1, 7, 5};
        int[] grumpy = new int[]{0, 1, 0, 1, 0, 1, 0, 1};
        System.out.println(new February23().maxSatisfied(customers, grumpy, 3));
    }
}
